home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #2 / Ham Radio 2000 - Volume 2.iso / HAMV2 / TCP_IP / TNOS230S / ARPHDR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-08-29  |  1.9 KB  |  74 lines

  1. /* ARP header conversion routines
  2.  * Copyright 1991 Phil Karn, KA9Q
  3.  */
  4. #include "global.h"
  5. #include "mbuf.h"
  6. #include "arp.h"
  7.  
  8. #if !defined(_lint)
  9. static char rcsid[] OPTIONAL = "$Id: arphdr.c,v 1.8 1996/08/29 12:11:16 root Exp root $";
  10. #endif
  11.  
  12.  
  13. /* Copy a host format arp structure into mbuf for transmission */
  14. struct mbuf *
  15. htonarp (arp)
  16. register struct arp *arp;
  17. {
  18. struct mbuf *bp;
  19. unsigned char *buf;
  20.  
  21.     if (arp == (struct arp *) NULL)
  22.         return NULLBUF;
  23.  
  24.     if ((bp = alloc_mbuf (ARPLEN + 2 * uchar (arp->hwalen))) == NULLBUF)
  25.         return NULLBUF;
  26.  
  27.     buf = bp->data;
  28.  
  29.     buf = put16 (buf, arp->hardware);
  30.     buf = put16 (buf, arp->protocol);
  31.     *buf++ = uchar(arp->hwalen);
  32.     *buf++ = uchar(arp->pralen);
  33.     buf = put16 (buf, arp->opcode);
  34.     memcpy (buf, arp->shwaddr, (size_t) uchar (arp->hwalen));
  35.     buf += arp->hwalen;
  36.     buf = put32 (buf, arp->sprotaddr);
  37.     memcpy (buf, arp->thwaddr, (size_t) uchar (arp->hwalen));
  38.     buf += arp->hwalen;
  39.     buf = put32 (buf, arp->tprotaddr);
  40.  
  41.     bp->cnt = (int16) ((unsigned char *) buf - bp->data);
  42.     return bp;
  43. }
  44.  
  45.  
  46. /* Convert an incoming ARP packet into a host-format structure */
  47. int
  48. ntoharp (arp, bpp)
  49. register struct arp *arp;
  50. struct mbuf **bpp;
  51. {
  52.     if (arp == (struct arp *) NULL || bpp == NULLBUFP)
  53.         return -1;
  54.  
  55.     arp->hardware = pull16 (bpp);
  56.     arp->protocol = pull16 (bpp);
  57.     arp->hwalen = (char) PULLCHAR (bpp);
  58.     arp->pralen = (char) PULLCHAR (bpp);
  59.     if (uchar (arp->hwalen) > MAXHWALEN || uchar (arp->pralen) != IPALEN)
  60.         return -1;    /* n5knx: bad packet */
  61.     arp->opcode = pull16 (bpp);
  62.     (void) pullup (bpp, (unsigned char *) arp->shwaddr, (int16) uchar (arp->hwalen));
  63.     arp->sprotaddr = pull32 (bpp);
  64.     (void) pullup (bpp, (unsigned char *) arp->thwaddr, (int16) uchar (arp->hwalen));
  65.     arp->tprotaddr = pull32 (bpp);
  66.  
  67.     /* Get rid of anything left over */
  68.     if (bpp) {
  69.         free_p (*bpp);
  70.         *bpp = NULLBUF;
  71.     }
  72.     return 0;
  73. }
  74.